// 引入 express
const express = require("express");
// 引入 multer
const multer = require("multer");
// 引入 path
const path = require("path");
// 引入 fs
const fs = require("fs");
// 引入 jsonwebtoken
const jwt = require("jsonwebtoken");
// 引入 bcryptjs
const bcryptjs = require("bcryptjs");
// 引入 UserModel
const UserModel = require("../models/user");
// 引入 checkToken
const checkToken = require("../middlewares/check-token");
// 创建 router 实例
const router = express.Router();

// 创建 upload
// console.log(__dirname, "=== dirname");
const upload = multer({
  dest: path.resolve(__dirname, "../uploads"),
  fileFilter: (req, file, cb) => {
    // 只要 jpg png 格式

    // 如果当前上传的文件的格式，符合 jpg png 则写入 req.file
    // 否则不写入 req.file
    cb(null, ["image/jpeg", "image/png"].includes(file.mimetype));
  },
});

/**
 * 修改密码，需要登录状态，也就是说需要传递 token 过来
 *
 * 请求地址：http://localhost:3000/user/password
 * 请求方式：POST
 * 请求参数：
 *    password 新密码
 *    Authorization    请求头中给我传递过来，值是之前给你的 token
 */
router.post("/password", checkToken, async (req, res) => {
  try {
    // // 1. 从请求头中获取传递过来的 token
    // const token = req.get("Authorization");
    // console.log("token: ", token);
    // // 2. 验证 token 的正确性
    // const userInfo = jwt.verify(token, "ABCDEFG");

    // console.log("userInfo：", userInfo);

    await UserModel.updateOne(
      {
        // _id: userInfo._id,
        _id: req.userInfo._id,
      },
      {
        password: bcryptjs.hashSync(req.body.password, 10),
      }
    );

    res.send({
      code: 0,
      msg: "修改成功",
    });
  } catch (error) {
    console.log(error);
    res.send({
      code: -1,
      msg: "修改失败",
    });
  }
});

/**
 * 上传头像，需要登录状态，也就是说需要传递 token 过来
 *
 * 请求地址：http://localhost:3000/user/upload-avatar
 * 请求方式：POST
 * 请求参数：
 *    avatar 头像文件 png、jpg
 *    Authorization    请求头中给我传递过来，值是之前给你的 token
 */
router.post(
  "/upload-avatar",
  checkToken,
  upload.single("avatar"),
  async (req, res) => {
    try {
      // // 1. 从请求头中获取传递过来的 token
      // const token = req.get("Authorization");
      // console.log("token: ", token);
      // // 2. 验证 token 的正确性
      // const userInfo = jwt.verify(token, "ABCDEFG");

      // 判断 req.file 是否存在
      if (!req.file) {
        res.send({
          code: -1,
          msg: "文件需要传递或文件格式不正确",
        });
        return;
      }

      console.log("req.file: ", req.file);

      // 读文件
      const fileData = fs.readFileSync(req.file.path, "binary");
      // 构建文件名
      const fileName = req.file.filename + req.file.originalname;
      // 构建文件存放路径 public/avatars/${fileName}
      const filePath = path.resolve(__dirname, "../public/avatars", fileName);

      // 写文件
      fs.writeFileSync(filePath, fileData, "binary");

      // 构建这个文件的访问地址 http://localhost:3000/avatars/a.jpg
      const fileUrl = `http://localhost:3000/avatars/${fileName}`;

      // 写入数据库
      await UserModel.updateOne(
        {
          _id: req.userInfo._id,
        },
        {
          avatar: fileUrl,
        }
      );

      res.send({
        code: 0,
        msg: "上传头像成功",
        data: fileUrl,
      });
    } catch (error) {
      console.log(error);
      res.send({
        code: -1,
        msg: "上传头像失败",
      });
    }
  }
);

// 导出 router
module.exports = router;
